#include "ssl_wrapper.h"
#include <openssl/err.h>
#include <stdio.h>

int init_openssl_engine()
{
    // 基本初始化OpenSSL
    OpenSSL_add_all_algorithms();
    ERR_load_crypto_strings();

    // GmSSL不需要特殊初始化，保留函数以确保API兼容
    fprintf(stdout, "OpenSSL初始化成功，GmSSL API可直接使用\n");
    return 1;
}

void cleanup_openssl()
{
    // 清理OpenSSL资源
    EVP_cleanup();
    CRYPTO_cleanup_all_ex_data();
    ERR_free_strings();
}

// 实现其他包装函数

SSL_CTX *create_ssl_context(int is_server)
{
    const SSL_METHOD *method;
    SSL_CTX *ctx;

    if (is_server)
    {
        method = TLS_server_method();
    }
    else
    {
        method = TLS_client_method();
    }

    ctx = SSL_CTX_new(method);
    if (!ctx)
    {
        perror("创建SSL上下文失败");
        ERR_print_errors_fp(stderr);
        return NULL;
    }

    // 设置验证模式和深度
    SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
    SSL_CTX_set_verify_depth(ctx, 4);

    return ctx;
}

SSL *setup_ssl_for_socket(SSL_CTX *ctx, int sock)
{
    SSL *ssl = SSL_new(ctx);
    if (!ssl)
    {
        perror("创建SSL对象失败");
        return NULL;
    }

    if (SSL_set_fd(ssl, sock) != 1)
    {
        perror("绑定SSL到套接字失败");
        SSL_free(ssl);
        return NULL;
    }

    return ssl;
}

void ssl_close(SSL *ssl)
{
    if (ssl)
    {
        SSL_shutdown(ssl);
        SSL_free(ssl);
    }
}

int ssl_send(SSL *ssl, const void *buf, int len)
{
    if (!ssl || !buf || len <= 0)
    {
        return -1;
    }

    return SSL_write(ssl, buf, len);
}

int ssl_recv(SSL *ssl, void *buf, int len)
{
    if (!ssl || !buf || len <= 0)
    {
        return -1;
    }

    return SSL_read(ssl, buf, len);
}

void ssl_ctx_cleanup(SSL_CTX *ctx)
{
    if (ctx)
    {
        SSL_CTX_free(ctx);
    }
}